home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programmer Power Tools
/
Programmer Power Tools.iso
/
packet
/
cbbs60so.arc
/
MB.C
< prev
next >
Wrap
Text File
|
1989-02-18
|
8KB
|
409 lines
/*
* MB.C - 2/17/89 - MailBox mainline code.
*/
/*
* Copyright (C) 1987, 1988
* On Modules by H. N. Oredson
* Copyright (C) 1988, 1989
* By the CBBS Group.
*
* This code was originality created and distributed
* to the packet radio community by W0RLI and VE3GYQ.
* It is being further being developed by the CBBS Group.
* It may be freely copied for non-commercial use,
* as long as this notice is retained.
*
* This notice and Copyright apply to all modules
* referenced by this module.
*
*/
#include "mb.h"
char *ver = "\nC-BBS V6.1, 17 Feb 1989\n";
char *nullstr = "";
PORTS *porthd = NULL;
PORTS *cport = NULL;
PORTS *port;
int scrmax, dirmax;
TMP *tmp;
MLM *motd;
char *helpfile, *infofile;
char *bbmenu, *symenu, *rmenus, *mumsg;
char *reqmsg, *qth, *keylst;
char *mcant, *mdone, *mfind, *mexst, *mnfile, *mnmsg;
char *mprot, *mtime, *mwhat, *mnport, *mndir, *minuse;
char achar, rchar, tchar, wchar;
word s_param;
byte s_flag, unt_hr, window, c_flag, b_flag;
char scmd[24];
main(argc, argv)
int argc;
char *argv[];
{
if (argc > 1) init(argv[1]); else init("config.mb");
while (true)
{
bidok = false;
hidok = false;
do_idle();
setbusy();
login();
if (!(port->mode & exclude)) do_cmds();
logo();
}
}
do_cmds()
{
register PORTS *p;
register char *i, *o;
p = port;
while(true)
{
prompt();
getcmd();
if (p->mode & gone) return;
/*
* Console broke in on a user?
*/
if (p->flags & p_opreq)
{
p->flags clrbit p_opreq;
prtx(talkm1);
if (p->tmode)
{
cmdtnc();
convtnc();
}
ioport(cport);
prtx(mumsg);
cport->fl = NULL;
term(p);
ioport(p);
tncstate();
if (p->tmode) trantnc(); else convtnc();
if (p->mode & gone) return;
}
/*
* Check for LINK.
* Require "LINKED to" to be first command.
*/
else if (islink(p->line))
{
if (p->cmdcnt) p->msg = mwhat; else
{
strcpy(p->line, p->line + 14);
logina(true);
remnl(p->line);
log('C', 'L', ' ', p->line);
if (p->mode & exclude) return;
}
}
/*
* Must be a command.
*/
else
{
docmd();
if (p->errors > p->errmax) p->mode = forced;
if (p->mode & (gone | idle | logout)) return;
}
}
}
/*
* Q command: exit to DOS.
*/
done()
{
byte pflg;
if (sure()) return;
upduser(cport->user);
log('X', 'Q', ' ', nullstr);
clslog();
clsusr();
clsmsg();
clsmon();
iooff();
clrbusy();
pflg = getp_flag();
putp_flag(pflg clrbit window);
exit(0);
}
/*
* Give the user a prompt.
*/
prompt()
{
register PORTS *p, *tp;
p = port;
if (p->msg isnt NULL) prtx(p->msg);
p->msg = NULL;
/*
* Tell sysop who this is.
*/
if (p isnt cport) { ioport(cport); prtx(mumsg); ioport(p); }
/*
* Show any connect request seen on the user port.
*/
if (p->flags & p_req) prtx(reqmsg);
p->flags clrbit p_req;
/*
* Bleed off any connect requests on other ports.
*/
for (tp = porthd; tp isnt NULL; tp = tp->next) if (tp->mode & idle)
if ((tp->dev is p_tnc) and (tp isnt p))
{
ioport(tp);
while (instat()) getdat();
}
ioport(p);
/*
* Display the prompt.
*/
curtim();
switch (p->mode)
{
case local :
case sysop :
prtx(symenu);
break;
case remote:
if (!(p->user->options & u_bbs))
{
if (s_param & s_p_name) if (!(p->user->state & u_name)) prtx(um[4]);
if (s_param & s_p_home) if (!(p->user->state & u_home)) prtx(um[5]);
if (s_param & s_p_zip) if (!(p->user->state & u_zip)) prtx(um[6]);
}
if (p->user->options & (u_bbs | u_expert)) prtx(bbmenu); else prtx(rmenus);
break;
}
}
/*
* Log the user off.
* Do any defered remote sysop command.
*/
logo()
{
register PORTS *p;
register PORTS *tp;
register char t;
p = port;
switch(p->mode)
{
case idle : t = 'A'; break; /* Init bbs logout */
case logout : t = 'B'; break;
case discon : t = 'D'; break;
case exclude: t = 'E'; break;
case forced : t = 'F'; distnc(); break;
case timeout: t = 'T'; prtx(mtime); break;
default : t = '?'; break;
}
log('X', t, ' ', nullstr);
/*
* If any port was used in terminal mode by the console,
* disconnect it.
*/
if (p->dev is p_console)
for (tp = porthd; tp isnt NULL; tp = tp->next)
if (tp->flags & p_term)
{
ioport(tp);
tp->mode = remote;
distnc();
tp->mode = idle;
tp->flags clrbit p_term;
}
ioport(p);
/*
* Change TNC back to "standard" if was in "sysop" mode.
* May have just THOUGHT we discon, REALLY disconnect.
*/
if (p->dev is p_tnc)
{
if (p->flags & p_clrsys) mkrem();
p->mode = remote;
distnc();
}
if (p->dev is p_serial) p->flags clrbit p_trans;
p->mode = idle;
upduser(p->user);
/*
* If there was a "defered remote sysop command" do it.
*/
ioport(cport);
if (s_param & s_cmd)
{
s_param clrbit s_cmd;
strcpy(cport->line, scmd);
parse();
wait(10); /* Give sysop chance to get HIS system online */
cport->mode = local; /* Do command as if console did it */
docmd();
cport->mode = idle;
}
clnlog();
clsusr();
setfwd();
clsmsg();
}
/*
* MailBox is idle.
* See if there is anything to do, and do it.
* If nothing to do, wait for connect.
*/
do_idle()
{
register PORTS *p;
register short curmin, lastmin;
for (p = porthd; p isnt NULL; p = p->next) p->ec = p->ecmon;
getc_flag();
if (c_flag & window) acmd();
allon(); /* Turn on monitoring and connects */
clrbusy();
curtim();
curmin = 10 * (l_time[2] - '0') + (l_time[3] - '0');
while(true)
{
/*
* Check the port command flag to see if another window has
* issued a command request. If so setup and do the command.
*/
getc_flag();
if (c_flag & window)
{
setbusy();
alloff();
acmd();
allon();
clrbusy();
}
lastmin = curmin;
curtim();
curmin = 10 * (l_time[2] - '0') + (l_time[3] - '0');
/*
* Once each minute:
* Forward now, if it is time on any port.
*/
if (curmin isnt lastmin) afwd(curmin);
/*
* Look for a login.
*/
for (p = porthd; p isnt NULL; p = p->next)
{
ioport(p);
if (instat()) switch(p->dev)
{
case p_serial:
p->flags clrbit p_give;
getdat();
p->flags setbit p_give;
if (iscon(p->line)) return;
break;
case p_tnc:
p->flags clrbit p_give;
getdat();
p->flags setbit p_give;
if (iscon(p->line)) return;
monitor();
break;
case p_console:
if (inchar() is wchar) return;
break;
}
p->flags setbit p_give;
}
}
}
/*
* Do commands retrieved from the bios.
*/
acmd()
{
char need_msg = false;
port->mode = local;
getcomd();
if (s_flag & s_dv) begin_lock();
if (port->opt1 is 'X')
{
readmsg();
readusr();
need_msg = true;
}
getc_flag();
putc_flag( c_flag clrbit window);
if (s_flag & s_dv) end_lock();
sprintf(port->line, "%c%c", port->opt1, port->opt2);
parse();
docmd();
if (need_msg)
{
clnlog();
setfwd();
clsmsg();
clsusr();
}
port->mode = idle;
}